package com.jlu.dao;


import com.jlu.domain.Customer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;

import java.util.List;

/*
符合SpringDataJpa的dao层接口规范
  JpaRepository<操作的实体类类型，实体类中主键属性的类型>
    封装了基本CRUD操作
  JpaSpecificationExecutor<操作的实体类类型>
    封装了复杂查询(分页)

 */
public interface CustomerDao extends JpaRepository<Customer,Long>,JpaSpecificationExecutor<Customer> {

  /*
  案例:根据客户名称查询客户
  使用jpql的形式查询
  jpql: from Customer where custName = ?
  配置jpql语句，使用的@Query注解
   */
  @Query(value = "from Customer where custName = ?")
  public Customer findJpql(String custName);

  /*
 案例,根据客户名称和客户id查询客户
 jpql: from Customer where custName = ? and custId =?
 对于多个占位符参数
    赋值的时候，默认的情况下，占位符的位置需要和方法参数中的位置保持一致可以指定占位符参数的位置
    ?索引的方式，指定此占位的取值来源

 */
  @Query(value = "from Customer where custName = ?2 and ID =?1")
  public Customer findCustNameCustId(Long id,String name);

  /*
  使用jpql完成更新操作
    案例 :根据id更新,客户的名称
    更新4号客户的名称,将名称改为“kane”
    sql : update cst_customer set cust_name = ? where cust_id = ?
    jpql : update Customer set custName = ? where custId =?

    @Query
      代表的是进行查询
    @Modifying
      当前执行的是一个更新操作

   */
  @Query(value = "update Customer set custName = ? where ID =?")
  @Modifying
  public void updateByJpql(String name,Long id);

  /*
  使用sql查询
   */
  @Query(nativeQuery = true,value = "select * from cust_customer")
  public List<Customer> findAllBySql();

  /*
  使用sql条件查询
   */
  @Query(nativeQuery = true,value = "SELECT * from cust_customer where cust_id = ?")
  public Customer findByIdBySql(Long id);


  /*
  方法名的约定:
    findBy:查询
      对象中的属性名(首字母大写):
      查询的条件CustName
    findByCustName--根据客户名称查询
      在springdataJpa的运行阶段会根据方法名称进行解析
      findBy属性名称 from xxx(实体类) where name = ?
    1.findBy + 属性名称(根据属性名称进行完成匹配的查询=)
    2.findBy + 属性名称 + “查询方式(Like l isnull)”
      findByCustNameLike
    3.多条件查询
      findBy + 属性名 ＋ “查询方式” ＋ “多条件的连接符（and|or)” + 属性名 + “查询方式”

   */
  public Customer findByCustName(String name);

  public List<Customer> findByCustNameLike(String name);

  public Customer findByCustNameAndId(String name,Long id);
}
